12. 构造函数

声明构造函数

Python 和 C++ 都有构造函数。构造函数定义了对象实例化时会发生什么。

Python 构造函数

它们定义了对象实例化时会发生什么。在 Python 中,语法是:

def __init__(self, variable1, variable2, ..., variablen):
    self.variable1 = variable1
    self.variable2 = variable2
    self.variablen = variablen

C++ 构造函数声明

在 C++ 中,构造函数声明如下:

Classname (datatype for variable1, datatype for variable2, …, datatype for variablen);

你也可以同时声明一个默认的构造函数。

Classname ();

实例化一个对象而不提供变量的值时,使用这个默认的构造函数。说得更具体一点,你将用一个二维向量来初始化一个矩阵变量。如果不提供二维向量,也可以使用默认向量来初始化矩阵变量。第二种情况中,可以使用空构造函数。

Gaussian 构造函数声明如下:

class Gaussian
{
    private:
        ...

    public:
        ...
        Gaussian ();
        Gaussian (float, float);

   ....
};

定义构造函数

声明了构造函数后,你需要在 .cpp 文件中实际定义它们。

构造函数定义的语法如下:

//空构造函数的语法
Classname::ClassName() {

    constructor function definition
}

// constructor function syntax
Classname::ClassName(datatype variable1, datatype variable2, …, datatype variablen) {

    constructor function definition

}

你可以看到这在 Gaussian 类中是如何实现的:

Gaussian::Gaussian() {
    mu = 0;
    sigma2 = 1; 
}

Gaussian::Gaussian (float average, float sigma) {
    mu = average;
    sigma2 = sigma;
}

请注意,构造函数不返回任何内容。它们只会初始化类变量。你可能还想知道,如果 mu 和 sigma2 是私有变量,函数定义如何能访问这两个变量。请记住,私有变量可以从类代码内部访问,但不能从类外部访问。

使用默认值初始化

在 Python 和 C++ 中,都可以在构造函数中使用默认值。在 Python 中,语法是:

def __init__(self, variable1 = default1, variable2 = default2, ..., variablen = defaultn):
    self.variable1 = variable1
    self.variable2 = variable2
    self.variablen = variablen

C++ 也有相同功能,但语法可能和所期望的不一样。默认值的定义实际上在 .h 文件函数定义中。下面一个加法类的简单例子,它包含两个整数并输出它们的总和。

以下为头文件 add.h:

class Add
{
    public:
        int a;
        int b;

        Add(int, int second = 17);

        int addition();
};

这里是 add.cpp 中的定义:

# include  "add.h"

Add::Add(int first, int second) {

    a = first;
    b = second;
}

int Add::addition() {
    return a + b;
}

请注意,默认值是在头文件中声明的。现在,如果在实例化 add 对象时只指定了一个值,则变量 b 将具有默认值 17:

# include <iostream>

# include  "add.h"

int main() {

    Add adder(5);
    std::cout << adder.addition() << std::endl;
    return 0;

}

上述代码输出值 22。

声明并定义矩阵类构造函数

现在轮到你了。填充 matrix.h 文件和 matrix.cpp 文件中的 TODO 部分。

Start Quiz:

#include <iostream>
#include <vector>
#include "matrix.h"

int main () {
    
    // TODO: Nothing to do here
    
    return 0;
}
#include "matrix.h"

/* TODO: Define the default constructor. Remember the syntax is
**      Classname::ClassName() {
**    
**          initialize variables
**    
**       }
**
**
**      You need to initialize the grid variable to a default value such as
**      a 4x4 matrix with all zeros.
**
**      Then initialize the rows variable, and the cols variable using the
**      vector size method. For example myvector.size() will give the size of
**      a vector. For a 2-dimensional vector, myvector.size() would be the
**      number of rows in a matrix.
**
*/

/* TODO: Define a constructor that receives a 2-Dimensional vector
**       and assigns the vector to the grid variable. 
**       
**      Remember the syntax is
**      Classname::ClassName(datatype inputvariablename) {
**    
**          classvariable = inputvariablename
**    
**       }
**
**      Then initialize the rows variable, and the cols variable exactly
**      as you did for the default constructor.
**
*/
#include <vector>

class Matrix 
{

        private:

            std::vector< std::vector<float> > grid;
            std::vector<float>::size_type rows;
            std::vector<float>::size_type cols;
            
        public:
        
        /* 
        ** TODO: Declare  constructor functions
        ** For the matrix class, you will need two constructor functions.
        ** 1. An empty constructor function
        ** 2. A constructor function that accepts a 2-dimensional vector
        */
        
};

matrix.h 参考答案

# include <vector>

class Matrix 
{

        private:

            std::vector< std::vector<float> > grid;
            std::vector<int>::size_type rows;
            std::vector<int>::size_type cols;

        public:

            // 构造函数声明
            Matrix ();
            Matrix (std::vector< std::vector<float> >);
};

matrix.cpp 参考答案

# include "matrix.h"

Matrix::Matrix() {
    std::vector <std:: vector <float> > initial_grid (10, std::vector <float>(5, 0.5));
    grid = initial_grid;
    rows = initial_grid.size();
    cols = initial_grid[0].size();

}

Matrix::Matrix(std::vector <std:: vector <float> > initial_grid) {
    grid = initial_grid;
    rows = initial_grid.size();
    cols = initial_grid[0].size();
}